package com.hnucm.ktstudy.base

/**
 * 在 Kotlin 中的一个类可以有一个主构造函数以及一个或多个次构造函数。
 * 主构造函数是类头的一部分：它跟在类名与可选的类型参数后。
 * 主构造函数不能包含任何的代码。初始化的代码可以放到以 init 关键字作为前缀的初始化块（initializer blocks）中。
 * 请注意，初始化块中的代码实际上会成为主构造函数的一部分。委托给主构造函数会作为次构造函数的第一条语句，因此所有初始化块与属性初始化器中的代码都会在次构造函数体之前执行。
 */
fun main() {

    val human=Person("lx",18);
    human.eat()
    human.sleep()
    human.play()
}

/**
 * 1.类的定义，创建对象（不需要new)
 * 2.类的继承，需要使用open关键字
 * 3.方法的重写覆盖 需要open 和 override 关键字
 * 4.类的初始化块 init() 常用来做参数的初始化
 */
//将入参声明为Human类的属性的简便写法
//属性默认是public
open class Human(private val name:String){
    open fun eat(){
        println("$name Eat")
    }

    fun sleep(){
        println("$name Sleep")
    }
}

class Person(private val name:String,protected val age:Int): Human(name){
    override fun eat(){
        super.eat()
        println("$name $age 吃米饭")
    }

    fun play(){
        println("$name $age 玩玩具")
    }
}
